package com.cy.store.controller;


import com.cy.store.controller.ex.*;
import com.cy.store.entity.Product;
import com.cy.store.entity.User;
import com.cy.store.service.IUserService;
import com.cy.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;


@RestController //@Controller +@ResponseBody
@RequestMapping("users")
public class UserController extends BaseController {
    @Autowired //得保证控制器的参数与前端传递的参数名称一致（name)
    private IUserService userService;

    /********************************************/
    /**
     * 注册
     * @param user
     * @return
     */
    @RequestMapping("reg")
    public JsonResult<Void> reg(User user) {
        // 调用业务对象执行注册
        userService.reg(user);
        // 返回
        return new JsonResult<>(OK);
    }


    /**
     * 登录
     * @param username
     * @param password
     * @param session
     * @return
     */
    @RequestMapping("login")
    public JsonResult<User> login(String username, String password, HttpSession session){
        // 调用业务对象的方法执行登录，并获取返回值
        User data =  userService.login(username, password);
        //向session对象中，完成数据的绑定（session是全局的）
        session.setAttribute("uid",data.getUid());
        session.setAttribute("username",data.getUsername());

        //获取session中绑定的数据
        System.out.println(getuidFromSession(session));
        System.out.println(getUsernameFromSession(session));

        // 将以上返回值和状态码OK封装到响应结果中并返回
        return new JsonResult<>(OK, data);
    }


    /**
     * 修改密码
     * @param oldPassword
     * @param newPassword
     * @param session
     * @return
     */
    @RequestMapping("change_password")
    public JsonResult<Void> changePassword (String oldPassword,String newPassword,HttpSession session){ //session是自动生成的参数，是一个全局变量
        Integer uid = getuidFromSession(session);
        String username = getUsernameFromSession(session);
        userService.changePassword(uid,username,oldPassword,newPassword);
        return new JsonResult<>(OK);

    }


    /**
     * 通过uid获取数据
     * @param session
     * @return
     */
    @RequestMapping("get_by_uid")
    public JsonResult<User> getByUid(HttpSession session){
        Integer uid = getuidFromSession(session);
//        System.out.println(uid);
        User data=userService.getByUid(getuidFromSession(session));
        return new JsonResult<>(OK,data);
    }

    /**
     * 修改个人信息
     * @param user
     * @param session
     * @return
     */
    @RequestMapping("change_info")
    public JsonResult<Void> changInfo(User user,HttpSession session){
        Integer uid = getuidFromSession(session);
        String username = getUsernameFromSession(session);
        userService.changeInfo(uid,username,user);
        return new JsonResult<>(OK);
    }


    /**
     * 上传头像
     *  MultipartFile接口 传输文件所定义的类型(任何file)
     *  @RequestParam 前后端映射转换标签(解决前后端参数不一致）
     *
     */

    /** 设置上传文件的最大值*/
    public static final int AVATAR_MAX_SIZE = 10*1024*1024;

    /** 限制上传文件的类型*/
    public static final List<String> AVATAR_TYPE= new ArrayList<>();
    static {
        AVATAR_TYPE.add("image/jpeg");   //就是jpg格式的文件
        AVATAR_TYPE.add("image/png");
        AVATAR_TYPE.add("image/bmp");
        AVATAR_TYPE.add("image/gif");
    }

    @RequestMapping("change_avatar")
    public JsonResult<String> changeAvatar(HttpSession session, @RequestParam("xxx") MultipartFile file //注意一下：控制器中的参数 必须与前端传递的参数一致
     ){
        //判断文件是否满足条件
        if (file.isEmpty()){
            throw new FileEmptyException("文件为空");
        }
        if (file.getSize() > AVATAR_MAX_SIZE){
            throw new FileSizeException("文件超出限制");
        }
        String contentType = file.getContentType();
        if (!AVATAR_TYPE.contains(contentType)){
            throw new FileTypeException("文件类型不支持");
        }

        /** String parent = session.getServletContext().getRealPath("upload");
         *  地址为//C: Users 14934 AppData Local Temp tomcat-docbase.8080.7345481018634876247 upload
         */

        // String parent = session.getServletContext().getRealPath("upload"); //在项目中创建upload文件夹，用来存在图片
        // File dir = new File(parent);

        //在本地建立Upload进行存储File dir = new File("C:/Users/14934/Desktop/舒镇洋-毕设/校园二手交易平台（mine)/static/upload");

        //获取运行项目的同级目录（jar包的话，为同级；本地运行的话，是在项目内部生成！！），作为文件的保存
        String path = System.getProperty("user.dir")+"/static/upload/";
        File dir = new File(path);


        //如果pathname不存在，则创建该目录
        if (!dir.exists()){
            dir.mkdirs();
        }
        //获取到这个文件的名称
        //例如：szy.png
        String originalFilename = file.getOriginalFilename();
        System.out.println(originalFilename);
        //获取. 后面的文件类型名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //采用UUID工具来生成一个新的字符串作为文件名 --> asdada-asdqw-vdvdv-eqwe.png
        String filename = UUID.randomUUID().toString().toUpperCase()+suffix;
        File dest = new File(dir,filename); //在dir下创建名为filename的文件
        try {
            file.transferTo(dest); //将file文件的信息转移到dest中，即保存本地服务器中
        } catch (IOException e) {
            throw new FileUploadIOException("文件读写异常");
        }catch (FileStateException e) {
            throw new FileStateException("文件状态异常");
        }

        Integer uid = getuidFromSession(session);
        String username = getUsernameFromSession(session);
        //返回头像的路径 /upload/test.png
        String avatar = "/upload/" +filename;
        System.out.println(avatar);
        userService.updateAvatarByUid(uid,avatar,username);
        //返回用户头像的路径给前端页面，进行头像的展示
        return new JsonResult<>(OK,avatar);
    }



    }





